package com.vincent.template.commons.validation.constraints;

import com.vincent.template.commons.validation.validators.MatchRegexValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author Vincent Wang
 * @Date 2020/10/22 10:00
 */
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {MatchRegexValidator.class})
public @interface MatchRegex {

    boolean required() default true;

    String regexp() default "";

    MatchRegex.Flag[] flags() default {};

    String message() default "格式不合法";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    enum Flag {
        /**
         * code值的正则（以字母开头，字符串只包含字母数字下划线）
         */
        CODE_VALUE("^[a-zA-Z][a-zA-Z0-9_]*$"),
        /**
         * 权限代码的正则（以字母开头，字符串只包含字母数字下划线和冒号）
         */
        AUTH_CODE_VALUE("^[a-zA-Z][a-zA-Z0-9_:]*$"),
        /**
         * 密码强度的校验
         * 6-16个字符，包含大小写字母、数字
         */
        PASSWORD("^[A-Za-z0-9]{6,16}$");

        private final String regexp;

        Flag(String regexp) {
            this.regexp = regexp;
        }

        public String getRegexp() {
            return regexp;
        }
    }

}
